package pincipal.pack;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;

import materiales.Material;

import database.Consulta;

import Presupuesto.Presupuesto;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class AgregarPresupuesto extends Activity {

	private TextView textViewFecha;
	private TextView textViewTotalNumeros;
    private Button pickDate;   
    private EditText nombre;
    private Button aceptar;
    private Button cancelar;
    private Button seleccionarPartidas;
    private ListView listaPartidas;   
    private Button volverMenuPrincipal;
    private Button volverAtras;
    private Button calcular;
    private Bundle bundle;
    private int anio;
    private int mes;
    private int dia;
    private float total;
	private ArrayList<String> seleccionados;
	private ArrayList<String> cantidades;
	private ArrayList<String> cantidadesOriginales;
	DecimalFormat df = new DecimalFormat("0.00");
	private boolean  toast = false;
	
    static final int DATE_DIALOG_ID = 0;
    DatePickerDialog fecha;
    AdaptadorEditarPresupuesto adaptador;
    private ProgressDialog pd;
    
    @Override
    public void onCreate(Bundle savedInstanceState) 
    { 	
    	super.onCreate(savedInstanceState);
    	requestWindowFeature( Window.FEATURE_NO_TITLE );
        setContentView(R.layout.nuevopresupuesto);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        
        bundle = getIntent().getExtras();
        String nombrePrevio = bundle.getString("NOMBRENUEVO");
		String fechaPrevia = bundle.getString("FECHAORIGINAL");
				
		this.seleccionados = (ArrayList<String>) bundle.getSerializable("LISTA");		
        this.cantidadesOriginales = (ArrayList<String>) bundle.getSerializable("CANTIDADES");
        
        this.nombre = (EditText)findViewById(R.id.nombrePresupuesto);
        this.aceptar = (Button)findViewById(R.id.botonFinalizar);
       
		this.cancelar = (Button)findViewById(R.id.botonCancelar);
		this.calcular = (Button)findViewById(R.id.calcular);
		this.seleccionarPartidas = (Button)findViewById(R.id.seleccionarPartidas);
        this.textViewFecha = (TextView) findViewById(R.id.dateDisplay);
        this.textViewTotalNumeros =  (TextView) findViewById(R.id.textViewTotalNumeros);
        this.pickDate = (Button) findViewById(R.id.pickDate);
        this.listaPartidas = (ListView)findViewById(R.id.listaPartidas);
        this.total = 0;
        
        ArrayAdapter<String> adaptadorSimple = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, seleccionados);
        adaptador = new AdaptadorEditarPresupuesto(this);
		listaPartidas.setAdapter(adaptador);
        llenarCantidades();
		calcularTotal();
		
        pickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        final Calendar c = Calendar.getInstance();
        anio = c.get(Calendar.YEAR);
        mes = c.get(Calendar.MONTH);
        dia = c.get(Calendar.DAY_OF_MONTH);

		
        if(nombrePrevio.length()>0)
		{
			nombre.setText(nombrePrevio);			
		}

		if(fechaPrevia.length()>0)
		{			
			textViewFecha.setText(fechaPrevia);
		}
        else
        {
        	actualizarFecha();
        }
		
        
        this.aceptar.setOnClickListener(new OnClickListener() 
		{	       	
			public void onClick(View arg0) 
			{
				String nombreP = nombre.getText().toString().trim();
				if(nombreP.trim().length()>0)
				{
					Cursor consulta = Consulta.consultNombrePresupuesto(AgregarPresupuesto.this, "'"+nombreP+"'");
				
					if(consulta.getCount()==0)
					{
						if(!seleccionados.isEmpty())
						{	
							if(!faltanCantidades())
							{
								
								int codigo = 0;
								String tipo = "presupuesto";
								Cursor consultId = Consulta.consultIdentificador(AgregarPresupuesto.this, "'"+tipo+"'");
								if (consultId.moveToFirst())
						        {
						        	do {
						    			codigo = consultId.getInt(1);		        		
						           } while(consultId.moveToNext());    	
						        } 
								Consulta.editIdentificador(AgregarPresupuesto.this, codigo+1, "presupuesto");
									
								
								calcularTotal();
								Consulta.insertPresupuesto(AgregarPresupuesto.this, codigo, nombreP,textViewFecha.getText().toString(), String.valueOf(df.format(total)));			
								Iterator iterador = seleccionados.listIterator();
								int cont = 0;
								while( iterador.hasNext() ) {						
							          String partida = (String)iterador.next(); 
							          Consulta.insertPartidaPresupuesto(AgregarPresupuesto.this, nombreP, partida, cantidades.get(cont));
							          cont++;
								}						
								toast = true;
								llamarDialog("Guardando Presupuesto");
						
							}
							else
							{
								Toast.makeText(AgregarPresupuesto.this, "Debe ingresar Cantidades", Toast.LENGTH_SHORT).show();									
							}
						}
						
						else 
						{
							Toast.makeText(AgregarPresupuesto.this, "Debe seleccionar partidas", Toast.LENGTH_SHORT).show();	
						}
					}
					else
					{
						Toast.makeText(AgregarPresupuesto.this, "Nombre de Presupuesto ya existe", Toast.LENGTH_SHORT).show();	
					}			
				}
				else 
				{
					Toast.makeText(AgregarPresupuesto.this, "Debe ingresar nombre de presupuesto", Toast.LENGTH_SHORT).show();			
				}
			}
		});
        
        
        this.cancelar.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{
				toast = false;
				llamarDialog("Cargando");	

			}
		});
        
        this.calcular.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{
				calcularTotal();		
			}
		});
        
        this.seleccionarPartidas.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{			
				Bundle bund = new Bundle();
				bund.putString("NOMBRENUEVO",nombre.getText().toString());
				bund.putString("FECHAORIGINAL", textViewFecha.getText().toString());
				bund.putString("TIPO", "agregar");
				bund.putStringArrayList("SELECCIONADOS", seleccionados);				
				bund.putStringArrayList("CANTIDADES", cantidades);
				Intent intent = new Intent(AgregarPresupuesto.this, SeleccionarPartidas.class);
				intent.putExtras(bund);
				startActivity(intent);					
			}
		});
        
        
        
        this.volverAtras = (Button)findViewById(R.id.volverAtras);
		this.volverAtras.setOnClickListener( new OnClickListener()
        {
        	public void onClick(View v)
        	{
        		toast = false;
        		llamarDialog("Cargando");
        	}
        	
        });
        
        this.volverMenuPrincipal = (Button)findViewById(R.id.menuPrincipal);
		this.volverMenuPrincipal.setOnClickListener( new OnClickListener()
        {
        	public void onClick(View v)
        	{
        		Intent intent = new Intent(AgregarPresupuesto.this, CubicMagic.class);
        		startActivity(intent);
        	}
        	
        });
				
    }
    
    
    private void llenarCantidades()
    {   	
    	cantidades = new ArrayList<String>();
    	int indice = seleccionados.size();
    	for(int i = 0; i< indice; i++)
    	{   		
    		if(cantidadesOriginales.get(i) != "")
    		{
    			cantidades.add(i, cantidadesOriginales.get(i));
    		}
    		else
    		{
    			cantidades.add(i, "1");
    		}
       	}
    }
    
    private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                anio = year;
                mes = monthOfYear;
                dia = dayOfMonth;
                actualizarFecha();
            }
        };

    
    
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:          
			return new DatePickerDialog(this,
                        mDateSetListener,
                        anio, mes, dia);
        }
        return null;
    }
    
    
    private void actualizarFecha() { 	
         textViewFecha.setText(
            new StringBuilder()
                    .append(dia).append("-")
                    .append(mes + 1).append("-")
                    .append(anio).append(" "));
    }
    
    private boolean faltanCantidades()
	{
    	boolean retorno = false;	
		Iterator iterador = cantidades.listIterator();
			while( iterador.hasNext() ) 
			{		
				String rend = (String) iterador.next();
				
				if(rend.equals("") )
		        {
			          retorno = true;						          	          							         
		        }	
				else if(rend.length()>0)
				{
					float d = Float.parseFloat(rend);
					if(d<=0)
					{
						retorno = true;
					}
				}
		    }
		return retorno;
	}
    
    public void calcularTotal()
    {
    	float totalLocal = 0;
    	int contador = 0;
    	double totalMaterial;
    	if(!seleccionados.isEmpty())
    	{    		
    		Iterator iterador = seleccionados.listIterator();
			while( iterador.hasNext() ) 
			{				
				double cantidad;
				if(cantidades.get(contador) == "" || cantidades.get(contador).length()==0)
				{
					
					cantidades.set(contador, "1");
					cantidad = 1;
				}
				else
				{
					cantidad = Double.valueOf(cantidades.get(contador));
				}
				 
				 contador++;
		          String nombrePartida = (String)iterador.next();
		          Cursor partidass = Consulta.consultMaterialesPartida(AgregarPresupuesto.this, nombrePartida);
		          int i  = 0;
		          if (partidass.moveToFirst())
		          {
		          	do {		      
		          		String material = partidass.getString(1);
		          		String rendimientoEnPartida = partidass.getString(2);
		          		Cursor rendimientoMaterial = Consulta.consultRendimientoMaterial(AgregarPresupuesto.this, "'"+material+"'");
		          		double a = Double.valueOf(rendimientoEnPartida).doubleValue();
		          		String c = null;
		          		String d = null;
		          		if (rendimientoMaterial.moveToFirst())
				          {
		          			do
		          			{
		          				d = rendimientoMaterial.getString(3);
		          			
		          			} while(rendimientoMaterial.moveToNext());  
				          }
		          		
		          		c = d;
		          		
		          		double b = Double.valueOf(c).doubleValue();
		          		
		          		totalMaterial =  a*b;
		          		totalLocal = (float) (totalLocal + totalMaterial);
		          		i++;
		             } while(partidass.moveToNext());    	
		          	
		          	totalLocal = (float) ((float)totalLocal * cantidad);
		          	String totalPesos;
		          }
			}	
			Cursor uf = Consulta.consultUF(AgregarPresupuesto.this, "uf");
			double partida = 22627.36;
			if (uf.moveToFirst())
            {
            	do {
            		partida = Double.parseDouble(uf.getString(1));
            		
                    Log.i("Valor uF : ", String.valueOf(partida));        
               } while(uf.moveToNext());
            }
			total = (float) (totalLocal*partida);
			
			textViewTotalNumeros.setText(String.valueOf(df.format(total)));
    	}
    	else
    	{
    		textViewTotalNumeros.setText(String.valueOf(total));
    	}
    }
    
    
    private void actualizar()
    {
    	Cursor fila =(Cursor)Consulta.consultPresupuestos(AgregarPresupuesto.this);
		String[] lista = new String[]{};
		lista = new String[fila.getCount()];
		ArrayList<Presupuesto> array = new ArrayList<Presupuesto>();
		int i = 0;
		Presupuesto presupuesto;
		if (fila.moveToFirst())
        {
        	do {               
        		lista[i] = fila.getString(2);
        		String nombrePresupuesto = fila.getString(2);
        		presupuesto = new Presupuesto(nombrePresupuesto , fila.getString(1));     		
        		array.add(array.size(), presupuesto);
                i++;
                Cursor partidas =(Cursor)Consulta.consultPartidasPresupuesto(AgregarPresupuesto.this, nombrePresupuesto);
                if (partidas.moveToFirst())
                {
                	do {
                		String partida = partidas.getString(1);
                		presupuesto.setPartida(partida, partidas.getString(2));
                           
                   } while(partidas.moveToNext());    	
                }    
           } while(fila.moveToNext());    	
        } 	
		Bundle bundleMaterial = new Bundle();
		bundleMaterial.putStringArray("LISTA", lista);
		bundleMaterial.putString("TIPO", "presupuesto");
		Intent intent = new Intent(AgregarPresupuesto.this, Buscar.class);
		intent.putExtra("ARRAY",array);
		intent.putExtras(bundleMaterial);       		
		startActivity(intent);		 	
    }
    
    class AdaptadorEditarPresupuesto extends ArrayAdapter {

		Activity context;		
		@SuppressWarnings("unchecked")
		public AdaptadorEditarPresupuesto(Activity context) 
		{
			super(context, R.layout.list_item, seleccionados);
			this.context = context;
			
		}
			
	public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = context.getLayoutInflater();
			final int posicion = position;
			
			View item = inflater.inflate(R.layout.list_item_editar_presupuesto, null);			
			
			TextView nombre = (TextView)item.findViewById(R.id.nombrePartida);
			nombre.setText(seleccionados.get(position));
			
			final EditText cantidadPartida = (EditText)item.findViewById(R.id.cantidadPartida);
			cantidadPartida.setText(cantidades.get(posicion));
			
			Button boton = (Button)item.findViewById(R.id.eliminarPartidaPresupuesto);
			boton.setBackgroundResource(android.R.drawable.ic_menu_delete);
			boton.setOnClickListener(new OnClickListener()
			{
				public void onClick(View arg0) {
					seleccionados.remove(posicion);				
					cantidades.remove(posicion);
					cantidadesOriginales = cantidades;
					llenarCantidades();			
					notifyDataSetChanged();
					calcularTotal();
				}
			});
			
			final EditText cantidad = (EditText)item.findViewById(R.id.cantidadPartida);
			cantidad.addTextChangedListener( new TextWatcher()
			{
				public void afterTextChanged(Editable s) {
					cantidades.set(posicion, String.valueOf(s));				
				}
				public void beforeTextChanged(CharSequence s, int start, int count,
						int after) {
				}
				public void onTextChanged(CharSequence s, int start, int before,
						int count) {
				}
			});			
			return(item);				
		}	
	}
	
    private void llamarDialog(String mensaje)
	{
		pd = ProgressDialog.show(this, mensaje, "Por favor espere...", true, false);
        new DownloadTask().execute("Parametros que necesite el DownloadTask");
	}
	
	private class DownloadTask extends AsyncTask<String, Void, Object> {
        protected String doInBackground(String... args) {
            actualizar();
            return "Datos ya procesados (resultado)";
        }

        protected void onPostExecute(Object result) {
            if(toast)
         	 {
         		Toast.makeText(AgregarPresupuesto.this, "Presupuesto guardado exitosamente", Toast.LENGTH_SHORT).show();			
  			
         	 }
        	if (AgregarPresupuesto.this.pd != null) {
            	AgregarPresupuesto.this.pd.dismiss();
            }
        }
   }
}
